# -*- coding:utf-8 -*-
# @Time : 2021/8/16 20:21
# @Author: tangn
# @File : OrderController.py
from typing import Optional

from fastapi import APIRouter, Depends

from config.Result import Result
from config.Signature import validator_signature
from core.order.dto.OrderDTO import OrderDTO
from core.order.service.OrderService import OrderService
from exception.ErrorCodeEnum import ErrorCodeEnum
from exception.ErrorCodeException import ErrorCodeException

# order 控制层

order = APIRouter(
    # 控制层前缀
    prefix="/order",
    # swagger 文档模块名称
    tags=["订单模块"]
)


@order.get("/getOrderListByForm", name="form形式查询样例(dto入参,VO出)")
def get_order_list(dto=Depends(OrderDTO)):
    """
    获取订单列表form形式查询格式
    在结构体为一维的时候，建议采用form形式
    :param dto: 查询数据
    :return: 订单列表
    """
    return Result(OrderService.getOrderList(dto))


@order.post("/getOrderListByJson", name="json形式查询样例(dto)")
def get_order_list_by_json(dto: OrderDTO):
    """
    通过json形式传输数据,适用于二维结构,必须采用post方法，get方法不支持
    :param dto: 查询数据
    :return:  订单列表
    """
    return Result(OrderService.getOrderList(dto))


@order.get("/getOrderListByFormPage", name="form形式查询样例(dto)-分页")
def get_order_list_by_form_page(dto=Depends(OrderDTO)):
    """
    获取订单列表form形式查询格式，进行分页
    :param dto: 查询参数
    :return: Result
    """
    if dto.page_number is None or dto.page_size is None:
        raise ErrorCodeException(ErrorCodeEnum.INVALID_PARAMS, "分页查询页码不能为空")
    return Result(OrderService.getOrderListPage(dto))


@order.get("/getOrderInfoBySigned", dependencies=[Depends(validator_signature)], name="验证签名查询样例")
def getOrderInfoBySigned():
    """
    签名验证使用方法
    :return: success
    """
    print("进入方法")
    return "success"


@order.get("/getOrderInfo", name="普通form传参样例")
def getOrderInfo(orderId: int, productName: Optional[str] = None):
    """
    查询订单信息
    :param orderId:  订单ID
    :param productName:  商品名称（非必传）
    :return: success
    """
    return Result(OrderService.getOrderInfo(orderId, productName))


@order.get("/updateOrderNo", name="更新单号")
def updateOrderNo(orderId: int, orderNo: str):
    return Result(OrderService.updateOrderNo(orderId, orderNo))
